package com.hzit.canal.listener;

import com.alibaba.fastjson.JSON;
import com.alibaba.otter.canal.protocol.CanalEntry;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.system.api.domain.Brand;
import com.xpand.starter.canal.annotation.*;
import io.swagger.annotations.Authorization;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.List;

import static com.alibaba.otter.canal.protocol.CanalEntry.EventType.DELETE;

/**
 * 类名：
 * 作者：WF
 * 功能：
 */
@CanalEventListener
@Slf4j
public class MyCanalListener {
	@Autowired
	private StringRedisTemplate redisTemplate;

	//1. 插入数据时，就会监听到
	// @InsertListenPoint
	public void onEventInsert(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
		log.info("正在添加数据。。。。");
		//1.1 获取到插入后的数据
		List<CanalEntry.Column> columnsList = rowData.getAfterColumnsList();
		//1.2 遍历添加的数据
		printInfo(columnsList);
	}
	//2. 修改数据时，就会监听到
	// @UpdateListenPoint
	public void onEventUpdate(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
		log.info("正在修改数据。。。。");
		//2.1  获取到修改前的数据
		List<CanalEntry.Column> beforeColumnsList = rowData.getBeforeColumnsList();
		//2.2 可以获取到修改后的数据
		List<CanalEntry.Column> afterColumnsList = rowData.getAfterColumnsList();
		//2.3 打印修改前与修改后的数据
		System.out.println("修改前的数据：");
		System.out.println("----------------------------");
		printInfo(beforeColumnsList);

		System.out.println("修改后的数据：");
		System.out.println("----------------------------");
		printInfo(afterColumnsList);

	}
	//3. 删除数据时，就会监听到
	// @DeleteListenPoint
	public void onEventDelete(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
		log.info("正在删除数据。。。。");
		System.out.println("删除前的数据：");
		printInfo(rowData.getBeforeColumnsList());
	}

	//4. 自定义监听
	@ListenPoint(table = {"tb_goods","tb_brand"},                // 只监听指定的表
			eventType = {                                       // 对指定事件进行监听
				DELETE,
				CanalEntry.EventType.INSERT,
				CanalEntry.EventType.UPDATE
	})
	public void onEventCustom(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
		switch (eventType){
			case  DELETE:           // 删除操作
				System.out.println("删除数据。。。");
				break;
			case UPDATE:            // 修改操作
				System.out.println("修改数据。。。");
				break;
			case INSERT:            // 添加操作,同步数据到redis中
				syncRedis(rowData.getAfterColumnsList());
				break;
		}

	}
	//5. 将添加到数据库的数据同步到redis中
	private void syncRedis(List<CanalEntry.Column> columnList) {
			//0. 定义要添加的学生对象
			Brand brand = new Brand();
			columnList.stream().forEach(col -> {
				//1. 获取要添加的数据列名
				String name = col.getName();
				//2. 得到字段的值
				String value = col.getValue();
				//3. 根据字段值，为对象brand赋值
				switch (name){
					case "id":
						brand.setId(new Long(value));
						break;
					case "name":
						brand.setName(value);
						break;
					case "first_char":
						brand.setFirstChar(value);
						break;
				}
			});
		//4. 最后，保存这个品牌到redis中
		redisTemplate.opsForHash().put(Constants.BRAND_LIST,brand.getId() + "", JSON.toJSONString(brand));
	}
	//6. 数据的打印
	private void printInfo(List<CanalEntry.Column> columnList) {
		columnList.stream().forEach(col -> {
			String name = col.getName();
			String value = col.getValue();
			System.out.println(name + ":" + value);
		});
	}
}
